﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using BusinessLogicLayer;
using DataAccessLayer;

namespace ChamCong.LanhDao
{
    public partial class QLNghiPhep : BasePage
    {
        CongBLL CBLL = new CongBLL();
        ThamSoBLL ts = new ThamSoBLL();
        XinNghiPhepBLL XNPBLL = new XinNghiPhepBLL();
        NhanVienBLL NVBLL = new NhanVienBLL();
        PhongBanBLL PBBLL = new PhongBanBLL();
        LoaiPhepBLL lpBLL = new LoaiPhepBLL();
        LoaiCongBLL lcBLL = new LoaiCongBLL();
        NgayNghiBLL nnBLL = new NgayNghiBLL();
        QuanLyPhanQuyenBLL pq = new QuanLyPhanQuyenBLL();
        int _MaPB, _MaNV;
        public static string _LoaiCong;
        public static double _SoCong, _SoCongThucNghi, _SoCongThuBay;
        protected void Page_Load(object sender, EventArgs e)
        {
            var tt = Request.QueryString["ThaoTac"];
            var mp = Request.QueryString["MaPhep"];
            //Response.Write(LamTron(0.5, 0) + "-" + LamTron(3.5, 1) + "-" + LamTron(4, 1)); // 0 - 3.5 - 4
            _MaNV = Convert.ToInt32(Session["MaNV"]);

            try
            {
                if (Session["MaNV"] == null)
                {
                    Response.Write("<script>alert('Vui lòng đăng nhập.');history.go(-1);</script>");
                }
                else
                {
                    _MaNV = Convert.ToInt32(Session["MaNV"]);
                    _MaPB = NVBLL.TimPhongBan(_MaNV);

                    bindGridView(LayLoaiDS());
                    if (tt != null)
                    {
                        bindDetailView(mp, tt);
                    }
                }
            }
            catch (Exception ex)
            {
                sbcMsgBox4.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Error, "Thông báo", ex.Message);
            }
        }
        public void bindDetailView(string _mp, string _tt)
        {
            if (_mp != null)
            {
                dtvChiTietDXP.Visible = true;
                List<PHEP> lstChiTietPhep = XNPBLL.ThongTinDXP(int.Parse(_mp), _MaPB, 0);
                if (!pq.LayMaRoleTuNV(_MaNV).Contains(1))
                {
                    lstChiTietPhep.RemoveAll(b => b.NHANVIEN.MaPB != NVBLL.LayMaPBTuNV(_MaNV) || b.MaNV == _MaNV);
                }
                else
                {
                    
                }
                dtvChiTietDXP.DataSource = lstChiTietPhep;
                dtvChiTietDXP.DataBind();
                Image2.Visible = true;
                if (lstChiTietPhep.Count > 0)
                {
                    if (_tt == "DSChoDuyet" || _tt == "TatCa")
                    {
                        btnDuyet.Visible = true;
                        btnKhongDuyet.Visible = true;
                        lblChuThich.Visible = true;
                        tbxChuThich.Visible = true;
                        tbxChuThich.Enabled = true;
                        btQuayLai.Visible = true;
                    }
                }


            }
        }
        public void bindGridView(string _tt)
        {
            List<DGVLOCPHEP> DSDonXinPhep = XNPBLL.Test(_tt, _MaPB);
            if (DSDonXinPhep.Count != 0)
            {
                if (pq.LayMaRoleTuNV(_MaNV).Contains(1))
                {
                    int a = DSDonXinPhep.RemoveAll(b => b.LaTruongPhongBan == false);
                    grvDSDonXinPhep.DataSource = DSDonXinPhep;
                }
                else
                {
                    List<DGVLOCPHEP> lstLocPB = DSDonXinPhep.Where(b => b.MaPB == NVBLL.LayMaPBTuNV(_MaNV) && b.MaNV != _MaNV).ToList();
                    grvDSDonXinPhep.DataSource = lstLocPB;
                }
                grvDSDonXinPhep.DataBind();
                Image1.Visible = true;
            }
            else
            {
                sbcMsgBox4.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Warning, "Thông báo", "Hiện thời không có dữ liệu!");
            }

        }
        public string LayLoaiDS()
        {
            string ds;
            if (Request.QueryString["ThaoTac"] == null)
            {
                ds = "TatCa";
            }
            else
            {
                ds = Request.QueryString["ThaoTac"].ToString();
            }

            return ds;
        }
        public string ktBuoi(object _Ngay)
        {
            if (_Ngay == null)
            {
                return "-";
            }
            else return _Ngay.ToString();
        }
        public string ktDuyet(object ttd)
        {
            if (ttd.ToString() == "1")
                return "Đã duyệt";
            else if (ttd.ToString() == "0")
                return "Chờ duyệt";
            return "Không duyệt";
        }
        public string ktTenNV(object tnv)
        {
            int _MaNV = Convert.ToInt32(tnv);

            NHANVIEN NV = NVBLL.LayNhanVien(_MaNV);
            return NV.HoTen;
        }
        public string ktPhongBan(object pb)
        {
            int _MaPB = Convert.ToInt32(pb);

            PHONGBAN PB = PBBLL.LayPhongBan(_MaPB);
            return PB.TenPB;
        }
        public string ktLoaiPhep(object lp)
        {
            int _MaPhep = Convert.ToInt32(lp);
            LOAIPHEP P = XNPBLL.LayLoaiPhep(_MaPhep);
            return P.TenLoaiPhep;
        }
        public double LamTron(double value, int fractionDigits)
        {
            double d = Math.Pow(10, fractionDigits);

            return (Math.Round(value * d) / d);
        }
        protected void btnDuyet_Click(object sender, EventArgs e)
        {
            try
            {
                int _mp = Convert.ToInt32(Request.QueryString["MaPhep"]);
                PHEP P = XNPBLL.layThongTinPhep(_mp);
                if ((P != null) && (P.TrangThaiDuyet == 0) && (P.NHANVIEN.MaNV != _MaNV))
                {

                    //P.MaPhep = _mp;
                    P.ChuThich = tbxChuThich.Text;
                    P.NguoiDuyet = Convert.ToInt32(Session["MaNV"]);
                    P.TrangThaiDoc = 0;
                    P.NgayDuyet = DateTime.Now;
                    P.TrangThaiDuyet = 1;
                    double snncl = Convert.ToDouble(P.SoNgayNghiCoLuong);

                    DateTime tn = P.TuNgay ?? DateTime.MaxValue;
                    DateTime dn = P.DenNgay ?? DateTime.MaxValue;

                    if (CBLL.LayDSCongPhep(tn, dn).Count == 0)
                    {
                        if (P.TuNgay != P.DenNgay) // Nghỉ nhiều ngày
                        {
                            _LoaiCong = lpBLL.LayLoaiPhepTheMaLP(Convert.ToInt32(P.MaLoaiPhep)).MaLoaiCong;
                            _SoCong = lcBLL.LaySoCong(_LoaiCong);
                            List<DateTime> allDates = GetAllDatesAndInitializeTickets(tn, dn);
                            //cau hoi dat ra la neu nghi 1.5 ngay, thi sao biet duoc ngay dau tien nghi, la 0.5 hay 1
                            if (Convert.ToInt32(P.LoaiBuoi) > 9)// 11, 10 là nghỉ từ chiều. 
                            {
                                //Kiểm tra thứ 7
                                if (tn.DayOfWeek == DayOfWeek.Saturday)
                                {

                                    int tt = Convert.ToInt32(ts.LayGiaTri("TTLVT7"));
                                    if (tt == 2)//làm cả ngày
                                    {
                                        _SoCongThucNghi = (_SoCong / 2);
                                    }
                                    else
                                    {
                                        _SoCongThucNghi = 0;
                                    }
                                }
                                else
                                {
                                    _SoCongThucNghi = (_SoCong / 2);
                                }
                                if (_SoCongThucNghi > 0)
                                {
                                    allDates.Remove(tn);
                                    CONG cc = new CONG();
                                    cc.MaNV = P.MaNV ?? int.MaxValue;
                                    cc.Ngay = P.TuNgay ?? DateTime.MaxValue;
                                    cc.SoCong = _SoCongThucNghi;
                                    if (lcBLL.LayMaLoaiCong(_SoCongThucNghi) != null)
                                    {
                                        cc.MaLoaiCong = lcBLL.LayMaLoaiCong(_SoCongThucNghi);
                                    }
                                    else
                                    {
                                        cc.MaLoaiCong = "N";
                                    }
                                    cc.TrangThaiChot = 0;
                                    CBLL.ThemCong(cc);
                                    snncl = snncl - _SoCongThucNghi; //Lúc này snncl về số nguyên
                                }

                            }
                            for (int i = 0; i < snncl; i++)
                            {
                                CONG c = new CONG();
                                c.MaNV = P.MaNV ?? int.MaxValue;
                                c.Ngay = allDates[i];

                                if (allDates[i].DayOfWeek == DayOfWeek.Saturday)
                                {

                                    int tt = Convert.ToInt32(ts.LayGiaTri("TTLVT7"));
                                    switch (tt)
                                    {

                                        case 1://Làm buổi sáng thứ 7
                                            _SoCongThucNghi = 0.5f;//phải là _SoCong / 2 
                                            break;
                                        case 2://Làm cả ngày thứ 7
                                            _SoCongThucNghi = _SoCong;
                                            break;
                                        case 3://Không làm thứ 7
                                            _SoCongThucNghi = 0;
                                            break;
                                    }

                                }
                                else
                                {
                                    if (allDates.Count == 1)
                                    {
                                        _SoCongThucNghi = snncl;
                                    }
                                    else
                                    {
                                        _SoCongThucNghi = _SoCong;
                                    }
                                }

                                c.SoCong = _SoCongThucNghi;
                                if (lcBLL.LayMaLoaiCong(_SoCongThucNghi) != null)
                                {
                                    c.MaLoaiCong = lcBLL.LayMaLoaiCong(_SoCongThucNghi);
                                }
                                else
                                {
                                    c.MaLoaiCong = "N";
                                }
                                c.TrangThaiChot = 0;
                                snncl = snncl - _SoCongThucNghi;
                                CBLL.ThemCong(c);
                                allDates.Remove(allDates[i]);
                                i--;

                            }
                        }
                        else
                        {
                            // Nghỉ nửa ngày
                            CONG cc = new CONG();
                            cc.MaNV = P.MaNV ?? int.MaxValue;
                            cc.Ngay = P.TuNgay ?? DateTime.MaxValue;
                            //cc.GioDen = P.DenNgay ?? DateTime.MaxValue;
                            if (snncl == 1)
                            {
                                cc.SoCong = 1;
                                cc.MaLoaiCong = "1";                            
                            }
                            else
                            {
                                cc.SoCong = 0.5f; 
                                cc.MaLoaiCong = "N";
                            }

                            cc.TrangThaiChot = 0;
                            CBLL.ThemCong(cc);
                        }
                        XNPBLL.DuyetDonXinPhep(P);
                        sbcMsgBox1.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Success, "Thông báo", "Đã duyệt phép!");
                        btnKhongDuyet.Visible = false;
                        btnDuyet.Visible = false;
                    }
                    else
                    {
                        Response.Write("<script>alert('Ngày nghỉ phép đã có và được duyệt, không thể duyệt thêm');history.go(-1);</script>");
                    }
                }
                else
                {
                    sbcMsgBox1.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Error, "Thông báo", "Không thể duyệt, vui lòng kiểm tra lại quyền và trạng thái duyệt!");
                }
            }
            catch
            {
                Response.Write("<script>alert('Ngày nghỉ phép đã có và được duyệt, không thể duyệt thêm');history.go(-1);</script>");
            }


        }
        public List<DateTime> GetAllDatesAndInitializeTickets(DateTime startingDate, DateTime endingDate)
        {
            List<DateTime> allDates = new List<DateTime>();

            for (DateTime date = startingDate; date <= endingDate; date = date.AddDays(1))
            {
                allDates.Add(date);
            }
            for (int i = 0; i < allDates.Count; i++)
            {
                if (allDates[i].DayOfWeek == DayOfWeek.Sunday || nnBLL.KiemTraTonTai(allDates[i]) == true || Convert.ToInt32(ts.LayGiaTri("TTLVT7")) == 3) //HOẶC NGÀY NGHỈ LỄ 
                {
                    allDates.Remove(allDates[i]);
                    i--;
                }
            }
            return allDates;
        }
        protected void btnKhongDuyet_Click(object sender, EventArgs e)
        {
            int _mp = Convert.ToInt32(Request.QueryString["MaPhep"]);

            if ((XNPBLL.layThongTinPhep(_mp) != null) && (XNPBLL.layThongTinPhep(_mp).TrangThaiDuyet == 0))
            {
                if (tbxChuThich.Text != "")
                {
                    PHEP P = new PHEP();
                    P.MaPhep = Int32.Parse(Request.QueryString["MaPhep"]);
                    P.ChuThich = tbxChuThich.Text;
                    P.NguoiDuyet = Convert.ToInt32(Session["MaNV"]);
                    P.NgayDuyet = DateTime.Now;
                    P.TrangThaiDoc = 0;
                    PHEP ThongTinPhep = XNPBLL.layThongTinPhep(Int32.Parse(Request.QueryString["MaPhep"]));
                    CT_PHEPTHUONGNIEN ptn = new CT_PHEPTHUONGNIEN();
                    double dSoNgayNghiConLai = Convert.ToDouble(ThongTinPhep.SoNgayNghiCoLuong);
                    if (ThongTinPhep.TuNgay != null)
                    {
                        if (XNPBLL.LayThongTinPhepThuongNienConLai(Convert.ToInt32(ThongTinPhep.MaNV), Convert.ToDateTime(ThongTinPhep.TuNgay)) != null)
                        {
                            dSoNgayNghiConLai = dSoNgayNghiConLai + (double)XNPBLL.LayThongTinPhepThuongNienConLai(Convert.ToInt32(ThongTinPhep.MaNV), Convert.ToDateTime(ThongTinPhep.TuNgay)).SoNgayNghiConLai;
                            ptn.Nam = Convert.ToDateTime(ThongTinPhep.TuNgay).Year;
                        }
                    }
                    else
                    {
                        if (ThongTinPhep.DenNgay != null)
                        {
                            if (XNPBLL.LayThongTinPhepThuongNienConLai(Convert.ToInt32(ThongTinPhep.MaNV), Convert.ToDateTime(ThongTinPhep.DenNgay)) != null)
                            {
                                dSoNgayNghiConLai = dSoNgayNghiConLai + (double)XNPBLL.LayThongTinPhepThuongNienConLai(Convert.ToInt32(ThongTinPhep.MaNV), Convert.ToDateTime(ThongTinPhep.DenNgay)).SoNgayNghiConLai;
                                ptn.Nam = Convert.ToDateTime(ThongTinPhep.DenNgay).Year;
                            }
                        }
                    }


                    ptn.MaNV = Convert.ToInt32(ThongTinPhep.MaNV);
                    ptn.SoNgayNghiConLai = dSoNgayNghiConLai;
                    XNPBLL.CapNhatPhepThuongNien(ptn);
                    XNPBLL.KhongDuyetDonXinPhep(P);
                    sbcMsgBox1.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Success, "Thông báo", "Không duyệt phép!");
                    btnDuyet.Enabled = false;
                }
                else
                {
                    sbcMsgBox1.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Error, "Thông báo", "Vui lòng để lại phản hồi khi không duyệt phép!");
                }
            }
            else
            {
                sbcMsgBox4.SetTitleText(SBWebControls.sbcMsgBox.eMessageType.Error, "Thông báo", "Không thể duyệt, vui lòng kiểm tra lại mã phép và trạng thái duyệt!");
            }


        }
        public string checkDuyet(object ttd)
        {
            if (ttd.ToString() == "1")
                return "Đã duyệt";
            else if (ttd.ToString() == "0")
                return "Chờ duyệt";
            return "Đang xử lý";
        }

        protected string AutoConvert(object datetimenow)
        {
            if (datetimenow.ToString().Trim() == "12/31/9999 11:59:59 PM")
            {
                return "---";
            }
            else
            {
                return string.Format("{0:dd/MM/yyyy}", Convert.ToDateTime(datetimenow));
            }
        }

        protected void grvDSDonXinPhep_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            grvDSDonXinPhep.PageIndex = e.NewPageIndex;
            this.bindGridView(LayLoaiDS());
        }

        protected void btQuayLai_Click(object sender, EventArgs e)
        {
            Response.Redirect("QLNghiPhep.aspx");
        }

        public string ktThongTinBuoi(object b)
        {
            string _strBuoi = b.ToString().Trim();
            string _strThongTin = string.Empty;
            if (_strBuoi.Length == 1)
            {
                int _iBuoi = int.Parse(_strBuoi);

                switch (_iBuoi)
                {
                    case 3:
                        _strThongTin = "Nghỉ cả ngày";
                        break;
                    case 1:
                        _strThongTin = "Nghỉ buổi sáng";
                        break;
                    case 2:
                        _strThongTin = "Nghỉ buổi chiều";
                        break;
                }
            }
            else
            {
                string _strTuNgayRutGon = _strBuoi.Substring(_strBuoi.Length - 2, 1);
                string _strDenNgayRutGon = _strBuoi.Substring(_strBuoi.Length - 1, 1);
                Label lblTuNgay = dtvChiTietDXP.FindControl("lblTuNgay") as Label;
                string strTuNgay = lblTuNgay.Text;
                Label lblDenNgay = dtvChiTietDXP.FindControl("lblDenNgay") as Label;
                string strDenNgay = lblDenNgay.Text;
                switch (_strTuNgayRutGon)
                {
                    case "3":
                        _strThongTin = "Từ ngày " + strTuNgay;
                        break;
                    case "0":
                        _strThongTin = "Từ sáng " + strTuNgay;// + " đến " + strDenNgay;
                        break;
                    case "1":
                        _strThongTin = "Từ chiều" + strTuNgay;// + " đến " + strDenNgay;
                        break;
                }
                switch (_strDenNgayRutGon)
                {
                    case "4":
                        _strThongTin += " đến ngày " + strDenNgay;
                        break;
                    case "0":
                        _strThongTin += " đến sáng " + strDenNgay;// + " đến " + strDenNgay;
                        break;
                    case "1":
                        _strThongTin += " đến chiều " + strDenNgay;// + " đến " + strDenNgay;
                        break;
                }
            }
            return _strThongTin;
        }
    }
}